#ifndef UPG_STRUCT_H
#define UPG_STRUCT_H

#include <QObject>

// 数据传输和命令定义
#define UPG_DATA_STACK                      1    // 电池堆数据
#define UPG_DATA_VERSION                    2    // 电池堆数据
#define UPG_DATA_BA_COM_INPUT_REG           3    // BA 100 通用输入寄存器

#define UPG_DATA_BANK_ALARM                 10   // 电池组告警信息
#define UPG_DATA_BANK_SGL_VOL1              11   // 单体电压   1 - 100
#define UPG_DATA_BANK_SGL_VOL2              12   // 单体电压 101 - 200
#define UPG_DATA_BANK_SGL_VOL3              13   // 单体电压 201 - 300
#define UPG_DATA_BANK_SGL_VOL4              14   // 单体电压 301 - 400
#define UPG_DATA_BANK_SGL_TEMP1             15   // 单体温度   1 - 100
#define UPG_DATA_BANK_SGL_TEMP2             16   // 单体温度 101 - 200
#define UPG_DATA_BANK_SGL_TEMP3             17   // 单体温度 201 - 300
#define UPG_DATA_BANK_SGL_TEMP4             18   // 单体温度 301 - 400
#define UPG_DATA_BANK_SGL_SOC1              19   // 单体Soc   1 - 100
#define UPG_DATA_BANK_SGL_SOC2              20   // 单体Soc 101 - 200
#define UPG_DATA_BANK_SGL_SOC3              21   // 单体Soc 201 - 300
#define UPG_DATA_BANK_SGL_SOC4              22   // 单体Soc 301 - 400
#define UPG_DATA_BANK_SGL_RES1              23   // 单体内阻   1 - 100
#define UPG_DATA_BANK_SGL_RES2              24   // 单体内阻 101 - 200
#define UPG_DATA_BANK_SGL_RES3              25   // 单体内阻 201 - 300
#define UPG_DATA_BANK_SGL_RES4              26   // 单体内阻 301 - 400
#define UPG_DATA_BANK_SGL_SOH1              27   // 单体Soh   1 - 100
#define UPG_DATA_BANK_SGL_SOH2              28   // 单体Soh 101 - 200
#define UPG_DATA_BANK_SGL_SOH3              29   // 单体Soh 201 - 300
#define UPG_DATA_BANK_SGL_SOH4              30   // 单体Soh 301 - 400
#define UPG_DATA_BANK_OTHER                 31   // 其他电池组数据

#define UPG_DATA_WARN_PARAM                 50   // 读取预警参数
#define UPG_DATA_ALARM_PARAM                51   // 读取告警参数
#define UPG_DATA_PROT_PARAM                 52   // 读取保护参数

#define UPG_DATA_BANK_FULFILL               89   // 完成
#define UPG_MSG_NOTIFICATION                90   // 消息通知

#define UPG_CMD_UPGRADE                     100   // 远程升级
#define UPG_CMD_REBOOT                      101   // 远程重启
#define UPG_CMD_LAST_VERSION                102   // 回退到上一版本
#define UPG_CMD_SET_WARN_PARAM              103   // 设置预警参数
#define UPG_CMD_SET_ALARM_PARAM             104   // 设置告警参数
#define UPG_CMD_SET_PROT_PARAM              105   // 设置保护参数
#define UPG_CMD_POST_BACK_BA                106   // 回传BA的版本

//////////////////////////////////////////////////////////////////////////
// 结构定义 需要一字节对齐 处理
#ifdef XNWIN
#pragma pack(push)      //保存对齐状态
#pragma pack(1)         //设定为1字节对齐

#define LINUX_PACK_1_BYTE  
#else
#define LINUX_PACK_1_BYTE   __attribute__((packed))
#endif

// 心跳包 注册包
typedef struct _SHeartbeat
{
	quint16 usAreaCode;       // 地区编码(电话区号)   
	quint8  uStationNo;       // 储能站号
	quint8  uTransmitNo;      // 转发编号	
}LINUX_PACK_1_BYTE SHeartbeat;

// UPG 消息头定义
typedef struct _SUpgHead
{
	quint8  uCmdType;         // 命令类型(1Byte)  
	quint8  uModbusAddrBg;    // 后台Modbus地址(1Byte)	 
	quint16 usDataLen;        // 数据长度(2Byte)	      文件传输最后一帧长度
}LINUX_PACK_1_BYTE SUpgHead;

typedef struct _SNetVersion
{
	quint8 usIP1;    
	quint8 usIP2;     
	quint8 usIP3; 
	quint8 usIP4; 
	quint8 usBaVers1; 	
	quint8 usBaVers2; 
	quint8 usBaVers3; 
	quint8 uaDacSrvVers;                     // xndacsrv  版本
	quint8 uaDacAssVers;                     // xndacass  版本
	quint8 uaProcSrvVers;                    // xnprocsrv 版本
	quint8 uaTranSrvVers;                    // xntransrv 版本
	quint8 uaViewVers;                       // xnview 版本
	quint8 uaPlatVers;                       // xnplat 版本
	quint8 uaResVers1; 
	quint8 uaResVers2; 
	quint8 uaResVers3; 
	quint8 uaResVers4; 

	quint8 usBcVers1; 	
	quint8 usBcVers2; 
	quint8 usBcVers3; 
	quint8 usBcVers4; 
	quint8 usBmuVers1; 	
	quint8 usBmuVers2; 
	quint8 usBmuVers3; 
	quint8 usBmuVers4; 
}LINUX_PACK_1_BYTE SNetVersion;

typedef struct _SNetBattStack 
{
	quint16 usStackState;                   // 电池堆状态                        1           0x1111禁充 0x2222禁放 0x5555告警 0xAAAA故障 0xBBBB正常
	quint16 usInstallBankNum;               // 安装电池组数                      2
	quint16 usBankNumInStack;               // 电池堆管辖电池组数                3
	quint16 usStackCfgInfo;                 // 电池堆配置信息					 4	         各电池组是否投入运行            
	quint16 usMaxBankSocNo;                 // 组SOC最大组号                     5
	quint16 usMinBankSocNo;                 // 组SOC最小组号                     6
	quint16 usMaxBankVolNo;                 // 组电压最大组号                    7
	quint16 usMinBankVolNo;                 // 组电压最小组号                    8
	quint16 usSglMaxVolBankNo;              // 最高单体电压电池组号              9
	quint16 usSglMaxVolNoInBank;            // 最高电压电池所在组的组内编号      10
	quint16 usSglMinVolBankNo;              // 最低单体电压电池组号              11
	quint16 usSglMinVolNoInBank;            // 最低电压电池所在组的组内编号      12
	quint16 usSglMaxTempBankNo;             // 最高电池温度电池组号              13
	quint16 usSglMaxTempNoInBank;           // 最高电池温度所在组的组内编号      14
	quint16 usSglMinTempBankNo;             // 最低电池温度电池组号              15
	quint16 usSglMinTempNoInBank;           // 最低电池温度所在组的组内编号      16
	quint16	usDI1;				            // 开关量输入-DI1		             17       1--交流正常， 0--交流失电
	quint16	usDI2; 	                        // 开关量输入-DI2                    18       1--闭合，     0--断开
	quint16	usDI3; 	                        // 开关量输入-DI2                    19
	quint16	usDI4; 	                        // 开关量输入-DI2		             20
	
	float fStackVol;                        // 电池堆电压                        51  
	float fStackCur; 	                    // 电池堆电流                        53
	float fStackPower;                      // 电池堆功率
	float fStackInsuRes;                    // 系统绝缘
	float fStackSoc;                        // 电池堆SOC                         55
	float fStackSoh; 	                    // 电池堆SOH                         57
	float fStackChargeEQ; 	                // 电池堆可充电量                    59
	float fStackDischargeEQ;                // 电池堆可放电量                    61
	float fStackSglChargeEQ;                // 电池堆单次充电电量                63
	float fStackSglDischargeEQ;             // 电池堆单次放电电量                65
	float fStackChargeEQAdd;                // 电池堆充电量累加值                67
	float fStackDischargeEQAdd; 	        // 电池堆放电量累加值                69
	float fStackSglChargeAh;                // 电池堆单次充电容量                
	float fStackSglDischargeAh;             // 电池堆单次放电容量                
	float fStackChargeAhAdd;                // 电池堆充容量累加值                
	float fStackDischargeAhAdd; 	        // 电池堆放容量累加值   
	float fSglVolDiffInStack;               // 单体电压压差极差值	             71
	float fSglMaxVolInStack;                // 最高单体电压   		             73
	float fSglMinVolInStack;                // 最低单体电压                      75
	float fSglTempDiffInStack;              // 电池温度温差极差值	             77
	float fSglMaxTempInStack;               // 最高电池温度                      79
	float fSglMinTempInStack;               // 最低电池温度                      81
	float fBankSocDiff;                     // 组SOC差极差值	                 83
	float fBankSocMax;                      // 组SOC最大                         85
	float fBankSocMin;                      // 组SOC最小                         87
	float fBankVolDiff;                     // 组电压差极差值	                 89
	float fBankVolMax;                      // 组电压最大                        91
	float fBankVolMin;                      // 组电压最小                        93
	float fStackAllowMaxChargePower;        // 电池堆当前允许最大充电功率        95 
	float fStackAllowMaxDischargePower;     // 电池堆当前允许最大放电功率        97 
	float fStackAllowMaxChargeCurrent;      // 电池堆当前允许最大充电电流        99 
	float fStackAllowMaxDischargeCurrent;   // 电池堆当前允许最大放电电流        101 
}LINUX_PACK_1_BYTE SNetBattStack;

typedef struct _SNetBattBankAlarm
{
	char aBankVolUpLimitWarn;	     // 组电压上限预警                 1
	char aBankVolDownLimitWarn;      // 组电压下限预警                 2
	char aChgCurUpLimitWarn;		 // 充电电流上限预警               3 
	char aDchgCurUpLimitWarn;		 // 放电电流上限预警               4
	char aSglVolUpLimitWarn;	     // 单体电压上限预警	           5
	char aSglVolDownLimitWarn;	     // 单体电压下限预警	           6	
	char aChgTempUpLimitWarn;	     // 充电温度上限预警	           7	
	char aChgTempDownLimitWarn;	     // 充电温度下限预警               8
	char aDchgTempUpLimitWarn;	     // 放电温度上限预警	           9	
	char aDchgTempDownLimitWarn;	 // 放电温度下限预警               10
	char aSglTempUpLimitWarn;	     // 单体温度上限预警	           11	
	char aSglTempDownLimitWarn;	     // 单体温度下限预警               12
	char aEnvTempUpLimitWarn;		 // 环境温度上限预警	           13
	char aEnvTempDownLimitWarn;	     // 环境温度下限预警	           14
	char aPowerLineTempUpLimitWarn;	 // 动力线温度上限预警	           15
	char aBankSocUpLimitWarn;	     // SOC超上限预警		           16
	char aBankSocDownLimitWarn;	     // SOC超下限预警		           17
	char aPosResDownLimitWarn;		 // 正极绝缘内阻下限预警           18
	char aNegResDownLimitWarn;		 // 负极绝缘内阻下限预警           19
	char aPackVolDiffUpLimitWarn;	 // 箱压差上限预警                 20
	char aPackTempDiffUpLimitWarn;	 // 箱温差上限预警                 21
	char aBankVolUpLimitAlarm;	     // 组电压上限告警                 22
	char aBankVolDownLimitAlarm;     // 组电压下限告警                 23
	char aChgCurUpLimitAlarm;		 // 充电电流上限告警               24 
	char aDchgCurUpLimitAlarm;		 // 放电电流上限告警               25
	char aSglVolUpLimitAlarm;	     // 单体电压上限告警	           26
	char aSglVolDownLimitAlarm;	     // 单体电压下限告警	           27	
	char aChgTempUpLimitAlarm;	     // 充电温度上限告警	           28	
	char aChgTempDownLimitAlarm;	 // 充电温度下限告警               29
	char aDchgTempUpLimitAlarm;	     // 放电温度上限告警	           30	
	char aDchgTempDownLimitAlarm;	 // 放电温度下限告警               31
	char aSglTempUpLimitAlarm;	     // 单体温度上限告警	           32	
	char aSglTempDownLimitAlarm;	 // 单体温度下限告警               33
	char aEnvTempUpLimitAlarm;		 // 环境温度上限告警	           34
	char aEnvTempDownLimitAlarm;	 // 环境温度下限告警	           35
	char aPowerLineTempUpLimitAlarm; // 动力线温度上限告警	           36
	char aBankSocUpLimitAlarm;	     // SOC超上限告警		           37
	char aBankSocDownLimitAlarm;	 // SOC超下限告警		           38
	char aPosResDownLimitAlarm;		 // 正极绝缘内阻下限告警           39
	char aNegResDownLimitAlarm;		 // 负极绝缘内阻下限告警           40
	char aPackVolDiffUpLimitAlarm;	 // 箱压差上限告警                 41
	char aPackTempDiffUpLimitAlarm;	 // 箱温差上限告警                 42
	char aBankVolUpLimitProt;	     // 组电压上限保护                 43
	char aBankVolDownLimitProt;      // 组电压下限保护                 44
	char aChgCurUpLimitProt;		 // 充电电流上限保护               45 
	char aDchgCurUpLimitProt;		 // 放电电流上限保护               46
	char aSglVolUpLimitProt;	     // 单体电压上限保护	           47
	char aSglVolDownLimitProt;	     // 单体电压下限保护	           48	
	char aChgTempUpLimitProt;	     // 充电温度上限保护	           49	
	char aChgTempDownLimitProt;	     // 充电温度下限保护               50
	char aDchgTempUpLimitProt;	     // 放电温度上限保护	           51	
	char aDchgTempDownLimitProt;	 // 放电温度下限保护               52
	char aSglTempUpLimitProt;	     // 单体温度上限保护	           53	
	char aSglTempDownLimitProt;	     // 单体温度下限保护               54
	char aEnvTempUpLimitProt;		 // 环境温度上限保护	           55
	char aEnvTempDownLimitProt;	     // 环境温度下限保护	           56
	char aPowerLineTempUpLimitProt;	 // 动力线温度上限保护	           57
	char aBankSocUpLimitProt;	     // SOC超上限保护		           58
	char aBankSocDownLimitProt;	     // SOC超下限保护		           59
	char aPosResDownLimitProt;		 // 正极绝缘内阻下限保护           60
	char aNegResDownLimitProt;		 // 负极绝缘内阻下限保护           61
	char aPackVolDiffUpLimitProt;	 // 箱压差上限保护                 62
	char aPackTempDiffUpLimitProt;	 // 箱温差上限保护                 63
	char aSglTempRise;	             // 电池温度温升过快               64
	char aPowerLineTempRise;	     // 动力线温度温升过快             65
	char aBMUConnFault;		         // BMU通讯故障	                   66
	char aBCMUConnFault;		     // BCMU通讯故障                   67	
	char aSglVolWireFault;           // 单体电压采集线故障             68
	char aBankVolWireFault;          // 总压采集线故障                 69
	char aCurWireFault;              // 电流采集线故障                 70
	char aTempWireBreak;             // 温度采集断线                   71
	char aTempShortCircuit;          // 温度采集短路                   72
	char aBMSFault;                  // BMS设备故障                    73
	char aSglVolInvalid;             // 单体电压无效                   74
	char aSglTempInvalid;            // 单体温度无效                   75
	char aBankVolInvalid;            // 组端电压无效                   76
}LINUX_PACK_1_BYTE SNetBattBankAlarm;

typedef struct _SNetBattBankOther 
{
	quint16 usBankState;             // 电池组状态                     1      0x1111禁充 0x2222禁放 0x5555告警 0xAAAA故障 0xBBBB正常 
	quint16	usBankChgDchgState; 	 // 电池组充放电状态	           2      1 - 开路 2 - 待机 3 - 充电  4 - 放电
	quint16 usCellNumInBank;         // 电池组管辖电池节数             3
	quint16 usTempNumInBank;         // 电池组管辖温度节数             4
	quint16 usPackNumInBank;         // 电池组管辖PACK数               5
	quint16	usChgNum; 	             // 电池组充电次数		           6
	quint16	usDchgNum; 	             // 电池组放电次数		           7
	quint16	usSglMaxVolNo;           // 单体电压最大节号               8
	quint16	usSglMinVolNo;           // 单体电压最小节号               9
	quint16	usSglMaxTempNo;          // 单体温度最大节号               10
	quint16	usSglMinTempNo;          // 单体温度最小节号               11
	quint16	usSglMaxResNo;           // 单体内阻最大节号               12
	quint16	usSglMinResNo;           // 单体内阻最小节号               13
	quint16	usSglMaxSocNo;           // 单体SOC最大节号                14
	quint16	usSglMinSocNo;           // 单体SOC最小节号                15
	quint16	usSglMaxSohNo;           // 单体SOH最大节号                16
	quint16	usSglMinSohNo;           // 单体SOH最小节号                17	
	quint16	usDI1;				     // 开关量输入-DI1		           18     1--闭合， 0--断开
	quint16	usDI2; 	                 // 开关量输入-DI2                 19
	quint16	usDI3; 	                 // 开关量输入-DI3                 20
	quint16	usDI4; 	                 // 开关量输入-DI4		           21
	quint16	usDI5; 	                 // 开关量输入-DI5		           22	
	quint16	usDI6; 	                 // 开关量输入-DI6		           23	

	float fBankVol; 	             // 组端电压		               51
	float fBankCur; 	             // 组电流		                   53
	float fBankPower;                // 组功率
	float fBankInsuRes;              // 组绝缘
	float fBankSoc;                  // 组SOC		                   55
	float fBankSoh;                  // 组SOH	                       57
	float fEnvTemp; 	             // 环境温度		               59
	float fPosRes; 	                 // 正极绝缘电阻	               61
	float fNegRes;                   // 负极绝缘电阻	               63
	float fBankChargeEQ; 	         // 电池组可充电量                 65 
	float fBankDischargeEQ; 	     // 电池组可放电量	               67
	float fBankSglChargeEQ;     	 // 电池组单次充电电量             69
	float fBankSglDischargeEQ; 	     // 电池组单次放电电量             71
	float fBankChargeEQAdd; 	     // 电池组累计充电电量	           73
	float fBankDischargeEQAdd;       // 电池组累计放电电量	           75
	float fBankSglChargeAh;     	 // 电池组单次充电容量             
	float fBankSglDischargeAh; 	     // 电池组单次放电容量             
	float fBankChargeAhAdd; 	     // 电池组累计充电容量	           
	float fBankDischargeAhAdd;       // 电池组累计放电容量	           
	float fSglVolDiffInBank;         // 组单体电压压差极差值           77
	float fSglAvgVol;                // 单体电压平均值                 79
	float fSglMaxVol;                // 单电电压最大值                 81	
	float fSglMinVol; 	             // 单电电压最小值	               83
	float fSglTempDiffInBank;        // 组单体温度温差极差值           85		
	float fSglAvgTemp; 	             // 单体温度平均值                 87
	float fSglMaxTemp;               // 单电温度最大值	               89	
	float fSglMinTemp;               // 单电温度最小值	               91	
	float fSglAvgRes;                // 单体平均内阻	               93
	float fSglMaxRes;                // 单体内阻最大值	               95	
	float fSglMinRes;                // 单体内阻最小值		           97
	float fSglAvgSoc; 	             // 单体SOC平均值                  99
	float fSglMaxSoc;                // 单体SOC最大值		           101
	float fSglMinSoc;                // 单体SOC最小值	               103	
	float fSglAvgSoh;                // 单体SOH平均值                  105
	float fSglMaxSoh;                // 单体SOH最大值	               107	
	float fSglMinSoh;                // 单体SOH最小值	               109	
	float fBankAllowMaxChargePower;       // 电池组最大充电功率             111 
	float fBankAllowMaxDischargePower;    // 电池组最大放电功率             113 
	float fBankAllowMaxChargeCurrent;     // 电池组最大充电电流             115 
	float fBankAllowMaxDischargeCurrent;  // 电池组最大放电电流             117 
}LINUX_PACK_1_BYTE SNetBattBankSglOther;

#ifdef XNWIN
#pragma pack(pop)                  // 恢复对齐状态
#endif

#endif // UPG_STRUCT_H